home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
ab20
/
ab20_archive
/
utilities
/
emulators
/
apple2emul.lzh
/
parse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-04-18
|
3KB
|
222 lines
/*
* a2, an Apple II emulator in C
* (c) Copyright 1990 by Rich Skrenta
*
* Command line interface written by Tom Markson
*
* Distribution agreement:
*
* You may freely copy or redistribute this software, so long
* as there is no profit made from its use, sale, trade or
* reproduction. You may not change this copyright notice,
* and it must be included prominently in any copy made.
*
* Send emulator related mail to: skrenta@blekko.commodore.com
* skrenta@blekko.uucp
*/
#include <stdio.h>
#include <signal.h>
#include <ctype.h>
#include "a2.h"
#include "cli.h"
char *
split(s)
char *s;
{
char *t;
extern char *strchr();
assert(s != NULL);
t = strchr(s, ' ');
if (t == NULL)
return("");
assert(*t == ' ');
*t++ = '\0';
while (*t && *t == ' ')
t++;
return(t);
}
match(a, b)
char *a;
char *b;
{
assert(a != NULL);
assert(b != NULL);
if (*b == '.' && strlen(b) > 1)
b++;
while (*a && *b) {
if (toupper(*a) != toupper(*b))
return(NO_MATCH);
a++;
b++;
}
if (!*a) {
if (!*b)
return(IDENTICAL);
else
return(PARTIAL);
} else
return(NO_MATCH);
}
is_hex_number(s)
char *s;
{
char *temp;
temp = s;
assert(s != NULL);
while (*s)
if (!isxdigit(*s++))
return(FALSE);
if (temp != s)
return TRUE;
else
return FALSE;
}
long get_hex_number(s)
char *s;
{
unsigned int x;
if (is_hex_number(s))
sscanf(s, "%x", &x);
else
return(-1);
return( (long) x );
}
parse_str(tbl, s, t)
struct cmdtbl tbl[];
char *s;
char *t; /* to be passed to handler functions */
{
int i;
int ret;
int partial = -1;
int count = 0;
i = 0;
while (tbl[i].name != NULL) {
ret = match(s, tbl[i].name);
if (ret == IDENTICAL) {
partial = i;
count = 0;
break;
} else if (ret == PARTIAL) {
partial = i;
count++;
}
i++;
}
if (partial == -1)
return(NO_MATCH);
if (count > 1)
return(AMBIGUOUS);
if (tbl[partial].func == NULL)
return(NOT_IMPLEMENTED);
assert(t != NULL);
return (*tbl[partial].func)(t);
}
parse(tbl, s)
struct cmdtbl tbl[];
char *s;
{
int ret;
char buf[1024];
char *t;
if (*s == '!') { /* shell escape-ish thing */
shell_escape(++s);
return(FALSE);
}
t = split(s);
if (*s == '\0') {
return(TRUE); /* single step */
} else if (strcmp(s, "?") == 0) {
dump_list(tbl, "Command, one of the following:\n\n");
} else switch (parse_str(tbl, s, t)) {
case AMBIGUOUS:
printf("Ambiguous command '%s'.\n", s);
break;
case NO_MATCH:
printf("Unknown command. Type ? for a list.\n");
break;
case NOT_IMPLEMENTED:
printf("Sorry, command not implemented yet.\n");
break;
case OK:
break;
case DISPLAY:
status(stdout);
break;
default:
assert(FALSE);
}
return(FALSE);
}
dump_list(tbl, header)
struct cmdtbl tbl[];
char *header;
{
int i, count;
char buf[1024];
printf(header);
i = 0;
count = 0;
while (tbl[i].name != NULL) {
if (*tbl[i].name != '.' || strlen(tbl[i].name) == 1) {
if (count % 4 == 3)
printf(" %-15s\n", tbl[i].name);
else
printf(" %-15s", tbl[i].name);
count++;
}
i++;
}
if (count % 4 != 0)
printf("\n");
}